package com.chang.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {

    // 目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 返回代理对象


    public Object getProxy() {
        /*
         *  Proxy.newProxyInstance();该方法带有三个参数
         *  1，ClassLoader 加载动态生成代理类的类加载器
         *  2，Class[] interface：目标对象实现的所有接口的class对象数组
         *  3，InvocationHandler 设置代理对象实现目标对象方法的过程
         * */
        ClassLoader classLoader = target.getClass().getClassLoader(); // 获取第一个参数类加载器
        Class<?>[] interfaces = target.getClass().getInterfaces();   // 获取第二个参数
        InvocationHandler invocationHandler = new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 方法调用之前做输出
                System.out.println("动态代理日志：" + method.getName() + "，参数：" + Arrays.toString(args));
                Object result = method.invoke(target, args);

                // 方法调用
                System.out.println("动态代理日志：" + method.getName() + "，结果：" + result);
                return result;
            }
        };

        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);

    }
}
